<?php
declare (strict_types = 1);

namespace app\api\controller;

use app\api\model\Menu as MenuModel;
use think\Request;
use think\response\Json;

/**
 * 路由管理控制器
 * 处理前端动态路由相关的接口
 */
class Route
{
    /**
     * 获取用户路由
     * 前端接口：/route/getUserRoutes
     * 返回用户可访问的动态路由配置
     * @param Request $request
     * @return Json
     */
    public function getUserRoutes(Request $request): Json
    {
        try {
            // TODO: 这里后续可以根据用户角色权限过滤菜单
            // $userId = $request->userId; // 从中间件或session获取用户ID
            // $userRoles = getUserRoles($userId); // 获取用户角色
            
            // 获取所有启用的菜单数据
            $menus = MenuModel::where('status', '1')
                ->order('order', 'asc')
                ->order('id', 'asc')
                ->select()
                ->toArray();
            
            // 转换为前端路由格式并构建树形结构
            $routes = $this->buildRouteTree(0, $menus);
            
            // 默认首页路由
            $home = 'dashboard';
            
            return json([
                'code' => 0,
                'msg' => '获取成功',
                'data' => [
                    'routes' => $routes,
                    'home' => $home
                ]
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => '获取用户路由失败：' . $e->getMessage(),
                'data' => null
            ], 500);
        }
    }
    
    /**
     * 获取常量路由
     * 前端接口：/route/getConstantRoutes
     * 返回系统的常量路由配置（不需要权限的路由）
     * @return Json
     */
    public function getConstantRoutes(): Json
    {
        try {
            // 获取所有常量路由（constant=1）
            $menus = MenuModel::where('status', '1')
                ->where('constant', '1')
                ->order('order', 'asc')
                ->order('id', 'asc')
                ->select()
                ->toArray();
            
            // 转换为前端路由格式并构建树形结构
            $routes = $this->buildRouteTree(0, $menus);
            
            return json([
                'code' => 0,
                'msg' => '获取成功',
                'data' => $routes
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => '获取常量路由失败：' . $e->getMessage(),
                'data' => null
            ], 500);
        }
    }
    
    /**
     * 检查路由是否存在
     * 前端接口：/route/isRouteExist
     * @param Request $request
     * @return Json
     */
    public function isRouteExist(Request $request): Json
    {
        try {
            $routeName = $request->param('routeName', '');
            
            if (empty($routeName)) {
                return json([
                    'code' => 400,
                    'msg' => '路由名称不能为空',
                    'data' => false
                ], 400);
            }
            
            // 检查路由是否存在且启用
            $exists = MenuModel::where('route_name', $routeName)
                ->where('status', '1')
                ->count() > 0;
            
            return json([
                'code' => 0,
                'msg' => '检查成功',
                'data' => $exists
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => '检查路由失败：' . $e->getMessage(),
                'data' => false
            ], 500);
        }
    }
    
    /**
     * 构建路由树形结构
     * 将数据库菜单数据转换为前端期望的路由格式
     * @param int $parentId 父菜单ID
     * @param array $menus 所有菜单数据
     * @return array
     */
    private function buildRouteTree(int $parentId = 0, array $menus = []): array
    {
        $tree = [];
        
        foreach ($menus as $menu) {
            if ($menu['parent_id'] == $parentId) {
                // 转换为前端路由格式
                $route = $this->menuToRoute($menu);
                
                // 递归获取子路由
                $children = $this->buildRouteTree($menu['id'], $menus);
                if (!empty($children)) {
                    $route['children'] = $children;
                }
                
                $tree[] = $route;
            }
        }
        
        return $tree;
    }
    
    /**
     * 将数据库菜单记录转换为前端路由格式
     * @param array $menu 菜单数据
     * @return array
     */
    private function menuToRoute(array $menu): array
    {
        // 基本路由信息
        $route = [
            'name' => $menu['route_name'],
            'path' => $menu['route_path'],
        ];
        
        // 组件路径（如果有）
        if (!empty($menu['component'])) {
            $route['component'] = $menu['component'];
        }
        
        // meta 元信息
        $meta = [];
        
        // 菜单标题
        if (!empty($menu['menu_name'])) {
            $meta['title'] = $menu['menu_name'];
        }
        
        // 国际化键
        if (!empty($menu['i18n_key'])) {
            $meta['i18nKey'] = $menu['i18n_key'];
        }
        
        // 图标
        if (!empty($menu['icon'])) {
            $meta['icon'] = $menu['icon'];
        }
        
        // 图标类型：1-iconify图标，2-本地图标
        if ($menu['icon_type'] == 2) {
            $meta['localIcon'] = $menu['icon'];
            unset($meta['icon']); // 本地图标时移除icon字段
        }
        
        // 是否在菜单中隐藏
        if ($menu['hide_in_menu'] == 1) {
            $meta['hideInMenu'] = true;
        }
        
        // 排序
        if (isset($menu['order'])) {
            $meta['order'] = (int)$menu['order'];
        }
        
        // 是否缓存
        if ($menu['keep_alive'] == 1) {
            $meta['keepAlive'] = true;
        }
        
        // 是否常量路由
        if ($menu['constant'] == 1) {
            $meta['constant'] = true;
        }
        
        // 外链地址
        if (!empty($menu['href'])) {
            $meta['href'] = $menu['href'];
        }
        
        // 激活的菜单
        if (!empty($menu['active_menu'])) {
            $meta['activeMenu'] = $menu['active_menu'];
        }
        
        // 是否支持多标签
        if ($menu['multi_tab'] == 1) {
            $meta['multiTab'] = true;
        }
        
        // 固定在标签页的位置
        if (!empty($menu['fixed_index_in_tab'])) {
            $meta['fixedIndexInTab'] = (int)$menu['fixed_index_in_tab'];
        }
        
        // 菜单类型：1-目录，2-菜单
        // 前端可能需要知道这是目录还是菜单
        // $meta['menuType'] = $menu['menu_type'];
        
        // 路由查询参数
        if (!empty($menu['query_params'])) {
            $queryParams = json_decode($menu['query_params'], true);
            if (!empty($queryParams)) {
                $meta['query'] = $queryParams;
            }
        }
        
        // 按钮权限配置
        if (!empty($menu['buttons'])) {
            $buttons = json_decode($menu['buttons'], true);
            if (!empty($buttons)) {
                $meta['buttons'] = $buttons;
            }
        }
        
        // 将 meta 添加到路由中
        if (!empty($meta)) {
            $route['meta'] = $meta;
        }
        
        return $route;
    }
    
    /**
     * 根据用户角色过滤路由（预留方法）
     * @param array $routes 路由数组
     * @param array $userRoles 用户角色数组
     * @return array
     */
    private function filterRoutesByRoles(array $routes, array $userRoles): array
    {
        // TODO: 实现基于角色的路由过滤
        // 这里可以根据菜单表中的角色字段（需要添加）进行过滤
        return $routes;
    }
}
